/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.flowumi.facade.Impl;

import com.flowumi.entity.Actividades;
import com.flowumi.entity.Algoritmo;
import com.flowumi.entity.CasosCalificacion;
import com.flowumi.entity.Cursos;
import com.flowumi.entity.Cursosestudiantes;
import com.flowumi.entity.Cursosestudiantesactividades;
import com.flowumi.entity.CursosestudiantesactividadesPK;
import com.flowumi.entityFacade.ActividadesFacadeLocal;
import com.flowumi.entityFacade.AlgoritmoFacadeLocal;
import com.flowumi.entityFacade.CasosCalificacionFacadeLocal;
import com.flowumi.entityFacade.CursosFacadeLocal;
import com.flowumi.entityFacade.CursosestudiantesFacadeLocal;
import com.flowumi.entityFacade.CursosestudiantesactividadesFacadeLocal;
import com.flowumi.facade.EstudianteFacade;
import com.flowumi.facade.ProfesorFacade;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;

/**
 *
 * @author ideacentre
 */
@Stateless
public class ProfesorFacadeImpl implements ProfesorFacade {

    @EJB
    CursosFacadeLocal cursosFacadeLocal;
    @EJB
    ActividadesFacadeLocal actividadesFacadeLocal;
    @EJB
    AlgoritmoFacadeLocal algoritmoFacadeLocal;
    @EJB
    CasosCalificacionFacadeLocal casosCalificacionFacadeLocal;
    @EJB
    EstudianteFacade estudianteFacade;
    @EJB
    CursosestudiantesactividadesFacadeLocal cursosestudiantesactividadesFacadeLocal;
    @EJB
    CursosestudiantesFacadeLocal cursosestudiantesFacadeLocal;

    @Override
    public List<Cursos> getListaCursosProfesor(String nombreUsuario) {
        return cursosFacadeLocal.getListaCursosProfesor(nombreUsuario);
    }

    @Override
    public Cursos getCursoProfesor(long id) {
        return cursosFacadeLocal.find(id);
    }

    @Override
    public void CrearActividad(Actividades actividad) {
        actividadesFacadeLocal.create(actividad);
        Cursos curso = actividad.getCurso();
        curso.getActividadesList().add(actividad);
        cursosFacadeLocal.edit(curso);
    }

    @Override
    public Actividades getActividadProfesor(Long idCurso, Integer idActividad) {
        return actividadesFacadeLocal.find(idActividad);
    }

    @Override
    public Actividades actualizarActividad(Actividades actividad) {
        actividadesFacadeLocal.edit(actividad);
        return actividadesFacadeLocal.find(actividad.getIdActividad());
    }

    @Override
    public Algoritmo getAlgoritmoProfesor(Integer idAlgoritmo) {
        return algoritmoFacadeLocal.find(idAlgoritmo);
    }

    @Override
    public void guardarAlgoritmo(Algoritmo algoritmo) {
        algoritmoFacadeLocal.edit(algoritmo);
    }

    @Override
    public void CrearCasoCalificacion(CasosCalificacion casosCalificacion) {
        casosCalificacionFacadeLocal.create(casosCalificacion);
        Actividades actividad = casosCalificacion.getActividades();
        actividad.getCasosCalificacionList().add(casosCalificacion);
        actividadesFacadeLocal.edit(actividad);
    }

    @Override
    public void actualizarAlgoritmoActividad(Actividades actividad) {
        algoritmoFacadeLocal.create(actividad.getIdAlgoritmo());
        actividadesFacadeLocal.edit(actividad);
    }

    @Override
    public void calificarActividad(Actividades actividad) {
        for (Cursosestudiantesactividades cea : actividad.getCursosestudiantesactividadesList()) {
            if (cea.getIdAlgoritmo() != null) {
                double nota = 0;
                long pesoTotal = 0;
                for (CasosCalificacion cc : actividad.getCasosCalificacionList()) {
                    pesoTotal += cc.getPeso().longValue();
                    if (new String(cc.getSalidas()).equals(estudianteFacade.correrAlgoritmo(cea.getIdAlgoritmo(), new String(cc.getEntradas()), cea.toString()))) {
                        nota += cc.getPeso().longValue();
                    }

                }
                nota = nota * 5 / pesoTotal;
                cea.setNota(nota);
                cursosestudiantesactividadesFacadeLocal.edit(cea);
            }
        }
    }

    @Override
    public void calificarCurso(Cursos curso) {
        for (Cursosestudiantes ce : curso.getCursosestudiantesList()) {
            double nota = 0;
            long pesoTotal = 0;
            for (Actividades a : curso.getActividadesList()) {
                pesoTotal += a.getPeso();
                Cursosestudiantesactividades c = new Cursosestudiantesactividades(new CursosestudiantesactividadesPK(curso.getIdCurso(), ce.getUsuarios().getNombreUsuario(), a.getIdActividad()));

                if (ce.getCursosestudiantesactividadesList().contains(c)) {
                    c = ce.getCursosestudiantesactividadesList().get(ce.getCursosestudiantesactividadesList().indexOf(c));
                    nota += c.getNota() * a.getPeso() / 5;
                }
            }
            nota = nota * 5 / pesoTotal;
            ce.setNota(nota);
            cursosestudiantesFacadeLocal.edit(ce);
        }
    }
}
